package com.thirteen.app.dao;

import com.thirteen.app.dto.PaperWithAnswerResponse.QuestionWithAnswerDto;
import com.thirteen.app.dto.PaperWithScoreResponse.QuestionWithScoreDto;
import com.thirteen.app.dto.PaperRespose.QuestionDto;
import com.thirteen.app.dto.PaperWithSolutionResponse.QuestionWithSolutionDto;
import com.thirteen.app.dto.QuestionAnswerDto;
import com.thirteen.app.dto.WrongQuestions;
import com.thirteen.app.entity.Question;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface QuestionDao {

    //    根据大题Id查出所有小题
    List<Question> queryQuestion(Integer questionTypeId);

    //    根据大题Id查出所有小题
    List<QuestionDto> queryQuestionDto(Integer questionTypeId);

    //    根据大题Id查出所有小题
    List<QuestionWithAnswerDto> queryQuestionWithAnswerDto(Integer questionTypeId);

    //    根据大题Id查出所有小题
    List<QuestionWithScoreDto> queryQuestionWithScoreDto(Integer questionTypeId);

    //    根据大题Id查出所有小题
    List<QuestionWithSolutionDto> queryQuestionWithSolutionDto(Integer questionTypeId);

    //    根据大题Id查出所有小题Id
//    List<Integer> queryQuestionId(Integer questionTypeId);

//    zql&ar


    /**
     * 通过ID查询单条数据
     */
    Question queryById(Integer questionid);

    /**
     * 查询指定行数据
     */
    List<Question> queryAllByLimit(@Param("offset") int offset, @Param("limit") int limit);


    /**
     * 通过实体作为筛选条件查询
     */
    List<Question> queryAll(Question question);

    /**
     * 新增数据
     */
    Integer insert(Question question);

    /**
     * 批量新增数据（MyBatis原生foreach方法）
     */
    int insertBatch(@Param("entities") List<Question> entities);

    /**
     * 批量新增或按主键更新数据（MyBatis原生foreach方法）
     */
    int insertOrUpdateBatch(@Param("entities") List<Question> entities);

    /**
     * 修改数据
     */
    int update(Question question);

    /**
     * 通过主键删除数据
     */
    int deleteById(Integer questionid);

    //分页查询
    List<QuestionAnswerDto> getquestionPageList(@Param("pageIndex") Integer pageIndex,
                                                @Param("pageSize") Integer pageSize,
                                                @Param("questionType") Integer questionType,
                                                @Param("repositoryId") Integer repositoryId,
                                                @Param("questionId") Integer questionId);

    int questionCount(@Param("questionType") Integer questionType, @Param("repositoryId") Integer repositoryId, @Param("questionId") Integer questionId);


    int deleteQuestion(@Param("questionId") Integer questionId, @Param("repositoryId") Integer repositoryId);


    // 根据id，mode，type进行查询
    // 当mode为0或3时为题库顺序列表，此时id为题库id，type为需要的题目类型列表，userId不使用
    // 当mode为1时为题库乱序列表，此时id为题库id，type为需要的题目类型列表，userId不使用
    // 当mode为2时为考试错题列表，此时id为考试id，type不使用，useId为当前用户id
    List<QuestionAnswerDto> getQuestionList(@Param("id") Integer id, @Param("mode") Integer mode,
                                            @Param("type") Integer[] type,
                                            @Param("userId") Integer userId);


    List<QuestionAnswerDto> getQuestionListMode_2(@Param("id") Integer id, @Param("mode") Integer mode,
                                                  @Param("type") Integer[] type,
                                                  @Param("userId") Integer userId);

    //查询所有错题
    List<WrongQuestions> selectAllWrongQuestions(Integer examRecordId,String content);

    //查询所有错题数量
    int getWrongQuestionsCount(@Param("content") String content,
                               @Param("examId") Integer examId,
                               @Param("userId") Integer userId);

    //删除错题
    int deleteWrongQu(@Param("questionId") Integer questionId, @Param("examRecordId") Integer examRecordId);


    List<QuestionDto> queryByListId(List<Integer> questionIdList);

    //   查出题目的数量
    Integer queryQuestionCount();
}
